/**
 * 对axios的一些统一处理
 */

import Axios from 'axios';
import { Toast } from 'antd-mobile-v2';
import { SetStroageItem, ClearStroage } from '@/utils/storage-utils';
import { ServiceMessage } from '@/constants';
import { GetToken } from '@/utils/session';
import history from '@/utils/history';

const service = Axios.create({
  // baseURL: '/api', // api 的 base_url
  // timeout: 20000 // 请求超时时间
});

/**
 * 添加请求拦截器
 * 暂时不用，，添加微信token在请求头
 */
service.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    // 设置token
    let token = GetToken();
    if (token) {
      config.headers['Authorization'] = token;
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
service.interceptors.response.use(
  (response) => {
    // console.log('response---{}', response);
    // 对响应数据做点什么
    if (response.data) {
      response.data.srvTime && SetStroageItem('srvTime', response.data.srvTime);
      return response.data;
    }
    Toast.fail(
      (response.data && response.data.message) || ServiceMessage.ERROR
    );
    return Promise.reject(response.data);
  },
  (error) => {
    // console.log('error=============={}', error.response);
    // 对响应错误做点什么 , 处理401 403等错误处理
    switch (error.response?.status) {
      case 401:
        ClearStroage();
        Toast.fail('登录失效，请重新登录');
        history.replace('/login');
        break;
      case 403:
      case 40131:
        Toast.fail('无访问权限');
        break;
      // todo ??? 这里添加提示，有时候会报很多java代码的异常错误
      // 还是要建议后台不要抛error
      case 500:
        // Toast.fail(error.response?.data?.message || ServiceMessage.ERROR);
        Toast.fail(ServiceMessage.ERROR);
        break;
      default:
        Toast.fail(ServiceMessage.ERROR);
    }
    return Promise.reject(error.response?.data);
  }
);

// 统一处理接口返回非200的情况
let request = (config = {}) => {
  return service(config).then((res) => {
    if (config.custom) {
      return res;
    }
    switch (res?.status) {
      case 200:
        return res;
      case 401:
      case 403:
      case 40131:
        return Promise.reject(res);
      default:
        res?.message && Toast.fail(res?.message || ServiceMessage.ERROR);
        return Promise.reject(res);
    }
  });
};
// 如果传入 string，这个就是url地址
const transformStrConfig = (config) =>
  typeof config == 'string' ? { url: config } : config;
['get', 'post', 'get', 'delete'].forEach((method) => {
  request[method] = (config) =>
    request({ ...transformStrConfig(config), method });
});

// 正常情况使用该导出，当请求错误，不再执行后续代码
export const Request = request;

// 兼容之前的代码
export default service;
